package com.eugenema.util;

import com.alibaba.excel.util.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 配置工具类
 *
 * @author Eugenema
 * @date 2023/3/11 21:49
 **/
public class ConfigUtil {
    private static Logger logger = LoggerFactory.getLogger(ConfigUtil.class);

    /** 日志存放路径 */
    public static final String LOGGER_FILE_PATH = System.getProperty("user.dir") + File.separator + "Logs" + File.separator;
    /** 配置文件名称 */
    public static final String CONFIG_COMMON = "common.properties";
    /** 配置文件存放路径 */
    public static final String CONFIG_PATH = System.getProperty("user.dir") + File.separator + "resources" + File.separator;
    /** 浏览器配置项：火狐程序文件 */
    public static final String BROWSER_CONFIG_FIREFOX_BIN = "webdriver_firefox_bin";
    /** 浏览器配置项：火狐驱动器 */
    public static final String BROWSER_CONFIG_FIREFOX_DRIVER = "webdriver_gecko_driver";
    /** 浏览器配置项：火狐浏览器个人配置文件 */
    public static final String BROWSER_CONFIG_FIREFOX_PROFILE = "webdriver_firefox_profile";
    /** 浏览器配置项：谷歌程序文件路径 */
    public static final String BROWSER_CONFIG_CHROME_BIN = "webdriver_chrome_bin";
    /** 浏览器配置项：谷歌驱动器路径 */
    public static final String BROWSER_CONFIG_CHROME_DRIVER = "webdriver_chrome_driver";
    /** 浏览器配置项：谷歌浏览器个人配置文件 */
    public static final String BROWSER_CONFIG_CHROME_PROFILE = "webdriver_chrome_profile";
    /** 最大保存截图数量 */
    public static final String SCREENSHOT_MAX_NUM = "screenshot_max_num";
    /** 每次删除截图数量 */
    public static final String SCREENSHOT_DELETE_NUM = "screenshot_delete_num";
    /** 截图保存路径 */
    public static final String SCREENSHOT_PATH = "screenshot_path";
    /** 全局等待时间（毫秒） */
    public static final String WAIT_TIME = "wait_time";
    /** 每个动作执行后的等待时间（毫秒） */
    public static final String RUNED_WAIT_TIME = "runed_wait_time";
    /** 访问被限制后，重试等待时间（毫秒） */
    public static final String RETRY_TIME = "retry_time";
    /** 最多重试次数 */
    public static final String RETRY_MAX_TIMES = "retry_max_times";
    /** Excel 模板文件存放路径 */
    public static final String EXCEL_TEMPLATE_PATH = "excel_template_path";
    /** Excel 生成文件存放路径 */
    public static final String EXCEL_OUTPUT_PATH = "excel_output_path";
    /** 需求一配置文件 */
    public static final String DEMAND_ONE_CONFIG = "demandOneConfig";
    /** 需求二配置文件 */
    public static final String DEMAND_TWO_CONFIG = "demandTwoConfig";
    /** 需求三配置文件 */
    public static final String DEMAND_THREE_CONFIG = "demandThreeConfig";
    /** 所有需求配置文件 */
    public static final String[] ALL_DEMAND_CONFIG = {DEMAND_ONE_CONFIG, DEMAND_TWO_CONFIG, DEMAND_THREE_CONFIG};
    /** 加载的配置文件：默认加载 common.properties */
    private static Properties properties = loadConfig(CONFIG_COMMON);
    /** 单个修改配置文件设置项 */
    private static Map<String, String> modifyProperties = new HashMap<>(20);

    /**
     * 获取 common.properties 配置文件的配置
     *
     * @param key 配置数据的键
     * @return 配置数据的值，读取失败返回 null
     * @author Eugenema
     * @date 2023/3/11 21:47
     **/
    public static String getProperty(String key) {
        if (StringUtils.isBlank(key)) {
            logger.error("获取配置文件失败：key 为空");
            return null;
        }

        return properties.getProperty(key);
    }

    /**
     * 设置配置文件值，并更新配置文件
     * </br>若 key 值在配置文件中已存在，则会覆盖，否则是新增
     *
     * @param modifyProperties 修改后的配置
     * @return 是否更新成功
     * @author 马寅广
     * @date 2023/4/14 15:57
     **/
    public static boolean setProperty(Map<String, String> modifyProperties) {
        if (modifyProperties == null || modifyProperties.size() < 1) {
            logger.error("设置配置文件失败：配置信息为空");
            return false;
        }

        for (Map.Entry<String, String> modifyPropertiesEntry : modifyProperties.entrySet()) {
            properties.setProperty(modifyPropertiesEntry.getKey(), modifyPropertiesEntry.getValue());
        }

        try {
            OutputStream ops = new FileOutputStream(CONFIG_PATH + CONFIG_COMMON);
            if (ops == null) {
                throw new Exception();
            }
            Writer writer = new OutputStreamWriter(ops, "UTF-8");
            properties.store(writer, "update config file");
            ops.close();
        } catch (Exception e) {
            logger.error("配置文件更新失败", e);
        }
        return true;
    }

    public static boolean setPropertySingle(String key, String value) {
        if (StringUtils.isBlank(key) || StringUtils.isBlank(value)) {
            logger.error("设置配置文件失败：配置信息为空");
            return false;
        }

        modifyProperties.clear();
        modifyProperties.put(key, value);
        return setProperty(modifyProperties);
    }

    /**
     * 加载指定配置文件
     * <br/>获取类路径 resources 目录下的文件
     *
     * @param config 配置文件
     * @return 配置文件数据，若获取失败，返回空对象
     * @author Eugenema
     * @date 2023/3/11 21:54
     **/
    private static Properties loadConfig(String config) {
        properties = new Properties();
        try {
            InputStream ins = new FileInputStream(CONFIG_PATH + config);
            if (ins == null) {
                throw new Exception();
            }
            InputStreamReader isr = new InputStreamReader(ins, "UTF-8");
            BufferedReader br = new BufferedReader(isr);
            properties.load(br);
        } catch (Exception e) {
            logger.error("配置文件加载失败", e);
        }
        return properties;
    }
}
